//几个常见的笔试题
//题目一
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char *p) { 
  p = (char *)malloc(100);
}
void Test(void) {
  char *str = NULL;
  GetMemory(str);//此处传参是对实参的拷贝,所以GetMemory()函数并不会对str做任何的改变
  strcpy(str, "hello world");
  printf(str);
  //假设我们上述传参不存在问题,但是此处要对str进行free()操作,因为是动态开辟的内存空间
}
int main(){
  Test();
  return 0;
}

//题目二
char *GetMemory1(void) {
  char p[] = "hello world";
  return p; }
  //此处返回的p会成功返回,但是此处的空间会随着函数的结束而销毁;

void Test1(void) {
  char *str = NULL;
  str = GetMemory1();//虽然str接受了一个返回值,但是因为函数的销毁,
  //导致指针指向的空间也被摧毁了,那么str指向的空间是随机的,那么此处的str就是一个野指针
  printf(str);
}
//题目三
void GetMemory2(char **p, int num) {
   *p = (char *)malloc(num);
}
void Test3(void) {
  char *str = NULL;
  GetMemory2(&str, 100);//此处是对问题一进行了修改,函数的参数得到了解决
  strcpy(str, "hello");
  printf(str);
  //千万不要忘了对str进行free()释放,并指向NULL
}

//题目四
void Test4(void) {
char *str = (char *) malloc(100);
  strcpy(str, str);
  free(str);
  //此处忘了对str进行NULL操作 ,因为free,所以空间进行了销毁
  if(str != NULL)
 {
  strcpy(str, str);
  printf(str);
 }
}
